Log.print('service module: pektis');

Service.pektis = {};

Service.pektis.refresh = function(req) {
	if (req.isvoli()) return;
	var pektis = req.url.hasOwnProperty('login') ? req.url.login : req.url.pektis;
	Service.pektis.load(pektis, function(pektis) {
		req.end();
		Service.pektis.refreshKinisi(pektis);
	}, function(login) {
		req.end('Απέτυχε η ενημέρωση των στοιχείων του παίκτη "' + login + '"');
	});
}

Service.pektis.refreshKinisi = function(pektis, enimerosi) {
	var kinisi = new Kinisi({
		'?': 'PR',
		'p': pektis.login,
		'o': pektis.onoma,
		'r': {},
	});
	for (var i in pektis.peparam) {
		kinisi.r[Prefadoros.peparamEco(i)] = pektis.peparam[i];
	}
	kinisi.kinisiAdd(enimerosi);
}

// Το service "snapshot" αποστέλλει ενημερωμένα δεδομένα για τον παίκτη που
// καθορίζεται με την παράμετρο "login". Τα δεδομένα αφορούν τα βασικά στοιχεία
// του παίκτη, τις παραμέτρους τού παίκτη και τις πληροφορίες προφίλ.

Service.pektis.snapshot = function(req) {
	if (req.isvoli()) return;
	if (!req.url.hasOwnProperty('login')) return req.end('Δεν περάστηκε "login" παράμετρος');

	var pektis = Skiniko.isPektis(req.url.login);
	if (pektis) Service.pektis.snapshotSend(req, pektis);
	else Service.pektis.load(req.url.login, function(pektis) {
		Service.pektis.snapshotSend(req, pektis);
	}, function(login) {
		req.end('Απέτυχε η ενημέρωση των στοιχείων του παίκτη "' + login + '"');
	});
}

Service.pektis.snapshotSend = function(req, pektis) {
	var snapshot, i;

	pektis.pektisEpafi();
	snapshot = {
		'p': pektis.login,
		'o': pektis.onoma,
		'r': {},
		'f': {},
	};
	for (i in pektis.peparam) {
		if (pektis.peparamAdiafori(req.pektis, i)) continue;
		snapshot['r'][Prefadoros.peparamEco(i)] = pektis.peparam[i];
	}
	for (i in pektis.profinfo) {
		if ((i != req.sinedria.pektis) && (i != pektis.login)) continue;
		snapshot['f'][i] = pektis.profinfo[i];
	}

	// Πρέπει να είναι με τήν JSON μέθοδο λόγω των newlines.

	req.end(JSON.stringify(snapshot));
}

// Το service "setPeparam" δέχεται ως παραμέτρους το είδος και την τιμή παραμέτρου παίκτη
// και ενημερώνει ανάλογα την εν λόγω παράμετρο για τον τρέχοντα παίκτη στην database και
// στο σκηνικό του server. Κατόπιν δημοσιοποιεί την αλλαγή της τιμής της παραμέτρου και
// παραλαμβάνουν την αλλαγή όσοι clients πρέπει να την παραλάβουν.

Service.pektis.setPeparam = function(req) {
	if (req.isvoli()) return;
	if (!req.url.hasOwnProperty('param')) return req.end('Ακαθόριστη παράμετρος παίκτη');
	if (!req.url.hasOwnProperty('timi')) return req.end('Ακαθόριστη τιμή παραμέτρου παίκτη');

	var param = Prefadoros.peparamOce(req.url.param);
	var timi = Prefadoros.peparamDecode(param, req.url.timi);

	req.pektis.peparamSetRow(param, timi, function() {
		req.end();
		req.pektis.peparamSet(param, timi);
		(new Kinisi({
			'?': 'PPRM',
			p: req.pektis.login,
			r: req.url.param,
			t: req.url.timi,
		})).kinisiAdd();
	}, function() {
		req.end('Δεν ενημερώθηκε η παράμετρος');
	});
}

// Στοιχεία των παικτών κρατούνται για μια μέρα στο σκηνικό του server
// από την τελευταία φορά που χρησιμοποιήθηκαν και εφόσον δεν υφίσταται
// σχετική συνεδρία, ή ο παίκτης δεν μετέχει ως παίκτης σε κάποιο τραπέζι.

Service.pektis.check = function() {
console.log('Service.pektis: check (' + globals.ora() + ')');
	Skiniko.pektisCleanup(function(pektis) {
		console.log('Service.pektis timeout: ' + pektis.login);
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "load" δέχεται το login name ενός παίκτη και επιχειρεί να τον εντάξει
// στο σκηνικό. Σε περίπτωση επιτυχίας καλείται η callback function "onsuccess" με
// παράμετρο τον νεοεισαχθέντα παίκτη ως αντικείμενο του σκηνικού, ενώ σε περίπτωση
// αποτυχίας καλείται η "onerror" με παράμετρο το login name του παίκτη.

Service.pektis.load = function(login, onsuccess, onerror) {
	var conn = DB.connection();
	var query = 'SELECT `login`, `onoma` FROM `pektis` WHERE `login` = BINARY ' +
		conn.escape(login) + ' LIMIT 1';
	conn.query(query, function(conn, rows) {
		if (rows.length != 1) {
			conn.free();
			if (onerror) onerror(login);
			return;
		}

		Service.pektis.profinfo(conn, (new Pektis()).rowSet(rows[0]), onsuccess);
	});
}

Service.pektis.profinfo = function(conn, pektis, onsuccess) {
	var query = 'SELECT `sxoliastis`, `kimeno` FROM `profinfo` WHERE `pektis` = BINARY ' +
		conn.escape(pektis.login);
	conn.query(query, function(conn, rows) {
		for (var i = 0; i < rows.length; i++) {
			pektis.profinfoRowSet(rows[i]);
		}

		Service.pektis.peparam(conn, pektis, onsuccess);
	});
}

Service.pektis.peparam = function(conn, pektis, onsuccess) {
	var query = 'SELECT `pektis`, `param`, `timi` FROM `peparam` WHERE `pektis` = BINARY ' +
		conn.escape(pektis.login);
	conn.query(query, function(conn, rows) {
		for (var i = 0; i < rows.length; i++) {
			pektis.peparamSet(rows[i]['param'], rows[i]['timi']);
		}

		Service.pektis.sxesi(conn, pektis, onsuccess);
	});
}

Service.pektis.sxesi = function(conn, pektis, onsuccess) {
	var query = 'SELECT `pektis`, `sxetizomenos`, `sxesi`, ' +
		'UNIX_TIMESTAMP(`pote`) AS `pote` FROM `sxesi` ' +
		'WHERE `pektis` = BINARY ' + conn.escape(pektis.login);
	conn.query(query, function(conn, rows) {
		conn.free();
		for (var i = 0; i < rows.length; i++) {
			pektis.sxesi[rows[i]['sxetizomenos']] = (new Sxesi()).rowSet(rows[i]);
		}

		pektis.pektisAdd();
		if (onsuccess) onsuccess(pektis);
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Service.pektis.lastIp = function(req) {
	if (req.isvoli()) return;
	if (!req.url.hasOwnProperty('login')) return req.end('Ακαθόριστος παίκτης');

	conn = DB.connection();
	query = 'SELECT `ip` FROM `sinedria` WHERE `pektis` = BINARY ' + conn.escape(req.url.login);
	conn.query(query, function(conn, rows) {
		for (var i = 0; i < rows.length; i++) {
			if (!rows[i]['ip'].validIp()) continue;
			conn.free();
			return req.end(rows[i]['ip']);
		}

		Service.pektis.lastIpLog(req, conn);
	});
}

Service.pektis.lastIpLog = function(req, conn) {
	query = 'SELECT `ip` FROM `istoriko` WHERE `pektis` = BINARY ' + conn.escape(req.url.login) +
		' ORDER BY `kodikos` DESC LIMIT 1';
	conn.query(query, function(conn, rows) {
		conn.free();
		for (var i = 0; i < rows.length; i++) {
			if (!rows[i]['ip'].validIp()) continue;
			return req.end(rows[i]['ip']);
		}
		req.end('Δεν βρέθηκε IP για τον παίκτη ' + req.url.login);
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Service.pektis.profinfoUpdate = function(req) {
	var pektis, conn, query;

	if (req.isvoli()) return;
	if (!req.url.hasOwnProperty('login')) return req.end('Ακαθόριστος παίκτης');
	if (!req.url.hasOwnProperty('kimeno')) return req.end('Ακαθόριστο κείμενο');

	pektis = Skiniko.isPektis(req.url.login);
	if (!pektis) return req.end(req.url.login + ': δεν βρέθηκε ο παίκτης στο σκηνικό');

	conn = DB.connection();
	if (req.url.kimeno)
		query = 'REPLACE `profinfo` (`pektis`, `sxoliastis`, `kimeno`) VALUES (' +
			conn.escape(pektis.login) + ',' + conn.escape(req.pektis.login) + ',' +
			conn.escape(req.url.kimeno) + ')';
	else
		query = 'DELETE FROM `profinfo` WHERE (`pektis` = BINARY ' + conn.escape(pektis.login) +
			') AND (`sxoliastis` = BINARY ' + conn.escape(req.pektis.login) + ')';
	conn.query(query, function(conn, res) {
		conn.free();
		req.end();
		pektis.profinfoUpdate(req.pektis.login, req.url.kimeno);
		Service.pektis.refreshKinisi(pektis);
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// ΠΡΕΠΕΙ ΝΑ ΦΤΙΑΧΤΕΙ ΜΕΘΟΔΟΣ "unload"
